package com.lin.ai.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.redis.RedisVectorStore;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import org.springframework.ai.vectorstore.SearchRequest;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;


/**
 * <p>
 * DPAiController
 * </p>
 *
 * @author liyang
 * @since 2025/4/22 14:30
 */
@RequiredArgsConstructor
@RestController
@RequestMapping("/ai/deepSeek")
public class DPAiController {

    private final ChatClient chatClient;

    private final VectorStore vectorStore;

    @GetMapping("/redis")
    public void ai() {
        List<Document> documents = List.of(
                new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
                new Document("The World is Big and Salvation Lurks Around the Corner"),
                new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));
        // Add the documents to Redis
        vectorStore.add(documents);
        // Retrieve documents similar to a query
        List<Document> results = this.vectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build());
        System.out.println("============:" + results);
    }

    /**
     * 生成文本（等待 AI 响应所有数据后返回）
     * @param userInput 用户输入
     * @return 响应结果
     */
    @GetMapping("/chatStr")
    public String chatStr(String userInput){
        return chatClient
                .prompt()
                .user(userInput)
                .call()
                .content();
    }

    /**
     * @param userInput 用户输入
     * @return 所有响应数据，包括：
     *          来自 AI 模型的响应是由类型定义的丰富结构ChatResponse.
     *          它包括有关响应生成方式的元数据，还可以包含多个响应，称为 Generations，
     *          每个响应都有自己的元数据。 元数据包括用于创建响应的标记数（每个标记大约是一个单词的 3/4）。
     *          此信息非常重要，因为托管 AI 模型根据每个请求使用的令牌数量收费。
     */
    @GetMapping("/chatResponse")
    public ChatResponse chatResponse(String userInput){
        return chatClient.prompt()
                .user(userInput)
                .call()
                .chatResponse();
    }

    /**
     * 生成文本（流式响应）
     * @param userInput 用户输入
     * @return 流式响应
     */
    @GetMapping(value = "/stream",  produces = "text/html;charset=utf-8")
    public Flux<String> stream(String userInput){
        return chatClient.prompt()
                .user(userInput)
                .stream()
                .content();
    }

    /**
     * 生成文本（流式响应）
     * @param userInput 用户输入
     * @return 流式响应
     */
    @GetMapping(value = "/getReserveSeat",  produces = "text/html;charset=utf-8")
    public Flux<String> getReserveSeat(String userInput){
        return chatClient.prompt()
                .system(s -> s.param("current_date", LocalDate.now().toString()))// 配置当前日期
                .user(userInput)
                .stream()
                .content();
    }








// ===================================================================================================================

    // 有问题
//    @GetMapping("/entity")
//    public ActorFilms entity(String userInput){
//        return chatClient.prompt()
//                .user(userInput)
//                .call()
//                .entity(ActorFilms.class);
//    }

}